package labox.innovation.gameserver.model;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

import javolution.util.FastMap;
import labox.innovation.gameserver.datatables.ItemTable;
import labox.innovation.gameserver.templates.item.L2Item;

/**
 * This class ...
 * npc贸易 物品链
 *
 * @version $Revision: 1.4.2.1.2.5 $ $Date: 2005/03/27 15:29:33 $
 */
public class L2TradeList {
	//物品链
	private Map<Integer, L2TradeItem> _items;

	//贸易链  所在位置的id
	//如:商店id等
	private int _listId;

	private String _buystorename, _sellstorename;

	//是否 有 有限库存产品
	private boolean _hasLimitedStockItem;

	//贸易链 所属的npc
	private String _npcId;

	public L2TradeList(int listId) {
		_items = new FastMap<Integer, L2TradeItem>();
		_listId = listId;
	}

	public void setNpcId(String id) {
		_npcId = id;
	}

	public String getNpcId() {
		return _npcId;
	}

	/**
	 * 增加 贸易物品
	 * @param item
	 */
	public void addItem(L2TradeItem item) {
		_items.put(item.getItemId(), item);
		if (item.hasLimitedStock()) {
			this.setHasLimitedStockItem(true);
		}
	}

	/*
	 * 替换 物品 价格
	 */
	public void replaceItem(int itemID, long price) {
		L2TradeItem item = _items.get(itemID);
		if (item != null) {
			item.setPrice(price);
		}
	}

	/**
	 * 移除物品
	 * @param itemID
	 */
	public void removeItem(int itemID) {
		_items.remove(itemID);
	}

	/**
	 * @return Returns the listId.
	 */
	public int getListId() {
		return _listId;
	}

	/**
	 * @param hasLimitedStockItem The hasLimitedStockItem to set.
	 */
	public void setHasLimitedStockItem(boolean hasLimitedStockItem) {
		_hasLimitedStockItem = hasLimitedStockItem;
	}

	/**
	 * @return Returns the hasLimitedStockItem.
	 */
	public boolean hasLimitedStockItem() {
		return _hasLimitedStockItem;
	}

	//设置 和 获取商店名
	public void setSellStoreName(String name) {
		_sellstorename = name;
	}

	public String getSellStoreName() {
		return _sellstorename;
	}

	public void setBuyStoreName(String name) {
		_buystorename = name;
	}

	public String getBuyStoreName() {
		return _buystorename;
	}

	/**
	 * @return Returns the items.
	 */
	public Collection<L2TradeItem> getItems() {
		return _items.values();
	}

	/**
	 * 获得 部分商品
	 * @param start
	 * @param end
	 * @return
	 */
	public List<L2TradeItem> getItems(int start, int end) {
		List<L2TradeItem> list = new LinkedList<L2TradeItem>();
		list.addAll(_items.values());
		return list.subList(start, end);
	}

	/**
	 * 获得指定物品的价格
	 * @param itemId
	 * @return
	 */
	public long getPriceForItemId(int itemId) {
		L2TradeItem item = _items.get(itemId);
		if (item != null) {
			return item.getPrice();
		}
		return -1;
	}

	/**
	 * 获得指定id的物品
	 * @param itemId
	 * @return
	 */
	public L2TradeItem getItemById(int itemId) {
		return _items.get(itemId);
	}

	/*
	public boolean countDecrease(int itemId)
	{
	    L2TradeItem item = _items.get(itemId);
	    if (item != null)
	    {
	        return item.hasLimitedStock();
	    }
		return false;
	}*/

	public boolean containsItemId(int itemId) {
		return _items.containsKey(itemId);
	}

	/**
	 * Itens representation for trade lists
	 * 描述贸易物品
	 *
	 * @author  KenM
	 */
	public static class L2TradeItem {
		private static final Logger _log = Logger.getLogger(L2TradeItem.class.getName());

		private final int _itemId;

		private final L2Item _template;

		private long _price;

		//        // count related
		//        private AtomicLong _currentCount = new AtomicLong();

		//-1表示 非有限库存商品
		//只需要这个字段。 其他不需要  现在所有npc出售的都是 非有限库存商品
		private long _maxCount = -1;

		public L2TradeItem(int itemId) {
			_itemId = itemId;
			_template = ItemTable.getInstance().getTemplate(itemId);
		}

		/**
		 * @return Returns the itemId.
		 */
		public int getItemId() {
			return _itemId;
		}

		/**
		 * @param price The price to set.
		 */
		public void setPrice(long price) {
			_price = price;
		}

		/**
		 * @return Returns the price.
		 */
		public long getPrice() {
			return _price;
		}

		public L2Item getTemplate() {
			return _template;
		}

		//        /**
		//         * @param maxCount The maxCount to set.
		//         */
		//        public void setMaxCount(long maxCount)
		//        {
		//            _maxCount = maxCount;
		//        }

		/**
		 * @return Returns the maxCount.
		 */
		public long getMaxCount() {
			return _maxCount;
		}

		/**
		 * 是否有限库存商品
		 * @return
		 */
		public boolean hasLimitedStock() {
			return this.getMaxCount() > -1;
		}

	}
}
